#include "head.h"

int initPool(status_t *list, int num){
    for(int i=0; i<num; i++){
        // 创建一个本地socket: 用来让父子进程通信
        // 固定操作:创建一个可以包含两个文件描述符的本地socket数组
        // 方便两个进程通过本地socket进行通信
        int local_socket[2];
        socketpair(AF_LOCAL, SOCK_STREAM, 0, local_socket);
        // 创建子进程,总共能创建num次
        pid_t son_id = fork();
        if(son_id == 0){
            // 子进程为了不接收信号
            // 脱离前台进程组
            setpgid(0, 0);
            // 子进程逻辑: 持有本地socket:0
            worker(local_socket[0]);

        }else{
            // 父进程逻辑: 持有本地socket:1 
            // 设置持有的本地socket的状态信息
            list[i].id = son_id;
            list[i].local_socket = local_socket[1];
            list[i].status = FREE;
        }
    }

    return 0;
}


// 在子进程中, 选择一个空闲的子进程
// 把新获得用来和具体的客户通信的socket对象
// 交给这个子进程: 让子进程和客户端通信
int toList(status_t *list, int num, int net_fd){
    
    for(int i=0; i<num; i++){
        if(list[i].status == FREE){
            // 把要通信的文件描述符通过本地socket传给子进程
            localSendMsg(list[i].local_socket, net_fd, 0);
            
            // 不要忘记把子线程的状态改为 忙
            list[i].status = BUSY;
            break;
        }
    }
    return 0;
}

int addEpoll(int epoll_fd, int fd){
    
    struct epoll_event event;
    event.events = EPOLLIN;
    event.data.fd = fd;
    epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &event);
}
